//获取随机数
function getNum(min, max = 0) {
    min > max ? [min, max] = [max, min] : "";
    return parseInt(Math.random() * (max - min + 1)) + min;
}

//获取标签样式
function getNodeStyle(node, temp = null) {
    if (node.currentStyle) {
        return node.currentStyle;
    } else {
        return window.getComputedStyle(node, temp);
    }
}

//设置视频全屏
function fullScreen(videNode) {
    if (videNode.requestFullscreen) {
        videNode.requestFullscreen();
    } else if (videNode.mozRequestFullscreen) {
        videNode.mozRequestFullscreen();
    } else if (videNode.webkitRequestFullscreen) {
        videNode.webkitRequestFullscreen();
    } else if (videNode.msRequestFullscreen) {
        videNode.msRequestFullscreen();
    }
}

//sessionStorage的动态设置与获取
let setInfo = (key, value) => sessionStorage.setItem(key, JSON.stringify(value));
let getInfo = key => JSON.parse(sessionStorage.getItem(key));


//防抖（fn需要执行的功能，waitTime多长时间后执行fn）
function debounce(fn, waitTime) {
    let timer = null;
    return function ({ ...a }) { //带参的防抖
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            fn({ ...a });
        }, waitTime);
    }
}
function debounce2(fn, delay) {
    let timer = null //借助闭包
    return function () {
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(fn, delay) // 简化写法
    }
}
//深拷贝
function deepCopy(oldInfo, newInfo = []) {
    //遍历数组或对象中的值
    for (let index in oldInfo) {
        //判断值是不是引用数据类型
        if (typeof oldInfo[index] == "object" && oldInfo[index] != null) {
            //判断值是不是数组
            newInfo[index] = oldInfo[index] instanceof Array ? [] : {};
            //如果是引用数据类型，则递归
            deepCopy(oldInfo[index], newInfo[index]);
        } else {
            //如果不是引用数据类型，存储数据
            newInfo[index] = oldInfo[index];
        }
    }
    return newInfo;
}

//多维数组转一维数组(inputArrs多维数组)
function manyDime(inputArrs, newArr = []) { //防止每次累加给返回数组默认值为空数组
    inputArrs.map(item => {
        if (!(item instanceof Array)) { //是不是数组（如果不是）
            newArr.push(item);
        } else {
            manyDime(item, newArr);
        }
    });
    return newArr;
}


//柯里化 func是需要实现柯里化的函数
function curry(func, ...args) {
    return function (...inArgs) {
        const allArgs = args.concat(inArgs);
        if (allArgs.length >= func.length) {
            return func(...allArgs);
        } else {
            return curry(func, ...allArgs);
        }
    }
}

//封装AJAX
function ajax({ method = "get", url, data, aysnc = true, success }) {
    let xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    //判定请求数据data是不是对象
    if (data instanceof Object) {
        data = toStr(data);
    }
    //判断请求方式，设置data位置
    if (method.toLowerCase() === "get") {
        xhr.open(method, url + (data ? "?" + data : ""), aysnc);
        xhr.send();
    } else {
        xhr.open(method, url, aysnc);
        xhr.send(data);
    }

    xhr.addEventListener("readystatechange", function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            //JSON格式的数据
            const text = xhr.responseText;
            if (text) {
                let arr = JSON.parse(text);
                success(arr);
            }
        }
    });
}

//data是对象时，转换成字符串的键值对形式
function toStr(obj) {
    let str = "";
    for (let key in obj) {
        str += `&${key}=${obj[key]}`;
    }
    return str.slice(1, str.length);
}

//data是字符串时，转换对象
function toObj(str) {
    let obj = {};
    if (str) {
        str.split("&").map(item => {
            let j = item.split("=");
            obj[j[0]] = j[1];
        });
    }
    return obj;
}

module.exports = {
    debounce2,
    debounce,
    deepCopy,
    getNum,
    manyDime
}